
#include <stdio.h>
#include <stdlib.h>
#include <linux/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>


typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;
typedef struct hostent hostent;
typedef struct servent servent;



int socket_descriptor, longueur;
	sockaddr_in adresse_locale;
	hostent *ptr_host;
	servent *ptr_service;
	char buffer[256];
	char mesg;
	char *prog;
	char *host;
    char *pseudo;
	int port;


/**Method qui ecoute le serveur **/
void* ecouteRetourServeur() {

    for(;;) {
        memset(buffer,0,sizeof(buffer));
        longueur = read(socket_descriptor, buffer, sizeof(buffer));
        write(1,buffer,longueur);

    }
} 

int main(int argc, char **argv){

	
    //char pseudonyme[256]=pseudo;
	//char nom[256]="Client";
	//char pseudo[256];
    pthread_t retourServeur;
	
	if(argc !=4){
		perror("usage : client <adresse-serveur> <port de connexion> <pseudo>");
		exit(1);
	}
	
	prog = argv[0];
	host = argv[1];
	port = atoi(argv[2]);
	pseudo = argv[3];
	
    //printf("pseudo : %s\n", pseudo);
	if((ptr_host = gethostbyname(host)) == NULL){
		perror("erreur : impossible de trouver le seveur a partir de son adresse");
		exit(1);
	}
	
	bcopy((char*)ptr_host->h_addr, (char*)&adresse_locale.sin_addr, ptr_host->h_length);
	adresse_locale.sin_family = AF_INET;
	
	adresse_locale.sin_port = htons(port);
	
	
	
	/* Création de la socket */
	if((socket_descriptor = socket(AF_INET, SOCK_STREAM, 0)) < 0){
		perror("erreur : impossible de creer la socket de connexion avec le serveur.");
		exit(1);
	}
	/* tentative de connexion au serveur dont les infos sont dans adresse_locale */
	if((connect(socket_descriptor, (sockaddr*)(&adresse_locale), sizeof(adresse_locale))) <0){
		perror("erreur : impossible de se connecter au serveur");
		exit(1);
	}
	
	write(socket_descriptor, pseudo, strlen(pseudo));
	//sprintf(pseudo, "%s%d : ", nom, socket_descriptor); 

	//Lancement du thread 
    if(pthread_create(&retourServeur, NULL, ecouteRetourServeur, NULL )) {
        perror("Erreur : probleme au lancement du thread");
        return 1;
    }

	
	for(;;) {
		//printf("Votre message : \n");
		//scanf("%s",&mesg);// Saisie du message à envoyer
		gets(&mesg);
		if(!strcmp(&mesg,"/sortir")||!strcmp(&mesg,"/quit")||!strcmp(&mesg,"/exit")){
            (write(socket_descriptor, &mesg, strlen(&mesg)));
            goto quit;
        }   
        //break;
		if(!strcmp(&mesg, "/clear")){
			system("clear");
		}

        if(!strcmp(&mesg, "/p")||!strcmp(&mesg, "/w")){
            	printf("chuchoter");
		(write(socket_descriptor, &mesg, strlen(&mesg)));
        }
		//printf("%s",strcat(pseudo,&mesg));
		// Envoie du message vers le serveur
		if((write(socket_descriptor, &mesg, strlen(&mesg))) < 0){
			perror("erreur : impossible d'ecrire le message destine au serveur.");
			exit(1);
		}
	}



	


quit:
	close(socket_descriptor);
	printf("deconnexion...\n");
	exit(0);
}